﻿using System.IO;
using System.Net.Http;
using System.Text.RegularExpressions;

namespace BlogsAPI.Abstract
{
    using System;
    using System.Net;

    /// <summary>
    /// Класс для наследований основных вещей браузинга в инете
    /// </summary>
    public abstract class WebInterface
    {
        /// <summary>
        /// some settings
        /// </summary>
        protected const RegexOptions Regexoptions = RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase;

        /// <summary>
        /// Куки общения с сервером
        /// </summary>
        [Obsolete]
        public string sCookie; 

        /// <summary>
        /// Процедура создания
        /// </summary>
        /// <param name="link">запрашиваемая ссылка</param>
        /// <remarks>Эта функция должна вызываться только из конкретного экземпляра класса</remarks>
        protected HttpWebRequest MakeRequest(String link)
        {
            HttpWebRequest ret = Common.MakeRequest(link);
            if (!String.IsNullOrEmpty(sCookie))//we have a cookie
            {
                ret.Headers.Add(HttpRequestHeader.Cookie, sCookie);
            }
            return ret;
        }

        /// <summary>
        /// Процедура создания
        /// </summary>
        /// <param name="link">запрашиваемая ссылка</param>
        /// <param name="allowAutoRedirect"></param>
        /// <param name="cookies"></param>
        /// <param name="methodPostContent"></param>
        /// <remarks>Эта функция должна вызываться только из конкретного экземпляра класса</remarks>
        //protected HttpResponseMessage MakeRequest2(String link,
        //    bool allowAutoRedirect = true, CookieCollection cookies = null, HttpContent methodPostContent = null)
        //{
        //    return Common.MakeRequest2(link, allowAutoRedirect, cookies, methodPostContent);
        //}

        /// <summary>
        /// Простой метод загрузки ссылки
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        protected string PerformRequest(string url, bool autoredirect = false)
        {
            var request = MakeRequest(url);
            request.AllowAutoRedirect = autoredirect;
            using (WebResponse response = request.GetResponse())
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                return reader.ReadToEnd();
            }
        }

        /// <summary>
        /// Разделитель в куках...
        /// </summary>
        protected virtual string[] CookieDivider{
            get
            {
                return new[] { "T,", "/,", ".ru,", ".com,", "HttpOnly,", "httponly,", "HTTPOnly," };
            }
        }


        /// <summary>
        /// разбор куков
        /// </summary>
        /// <param name="input"></param>
        /// <returns>Новую куку, которая по умолчанию и так используется в объекте</returns>
        protected virtual string CookieParse(string input)
        {
            if (!String.IsNullOrEmpty(input))
            {
                //уберем все комментарии.
                string oneval;
                sCookie = "";
                string[] parts = input.Split(CookieDivider, StringSplitOptions.RemoveEmptyEntries);
                foreach (string val in parts)
                {
                    oneval = val.TrimStart();
                    if (!sCookie.Contains(oneval.Substring(0, oneval.IndexOf(';') + 1)))
                    {
                        sCookie += oneval.Substring(0, oneval.IndexOf(';') + 1) + " ";
                    }
                }
                sCookie = sCookie.Trim().Trim(';');
            }
            return sCookie;
        }        
        
    }

}
